#include "stm32f10x_usart.h"
#include "sys.h"
#include "uart.h"
#include "stdio.h"

u8 uart_recv_buf[UART1_LEN];

void uart_init(u32 bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 使能uart1、GPIOA时钟

    // USART1_TX   GPIOA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // USART1_RX	  GPIOA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;            // PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // Usart1 NVIC
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        // 子优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           // IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);

    // USART1
    USART_InitStructure.USART_BaudRate = bound; // 波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl =
        USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(USART1, &USART_InitStructure);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE);

    uart_recv_buf[UART1_LEN-1] = '\0';
}

void USART1_IRQHandler(void)
{
    static u16 cnt = 0;

    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        uart_recv_buf[cnt] = USART_ReceiveData(USART1);
        if((cnt ++) >= UART1_LEN-1){
            cnt = 0;
        }

    }
}

#ifdef RTT_DEBUG
#include "stdio.h"
#include "SEGGER_RTT.h"
// 定义 stderr 的符号
const char __stdout_name[] = "STDOUT";
const char __stderr_name[] = "STDERR";

// 重定向 stdout/stderr 到 RTT
int fputc(int ch, FILE *f) {
    SEGGER_RTT_PutChar(0, ch);
    return ch;
}
#else
int fputc(int ch, FILE* f)
{
    while ((USART1->SR & USART_FLAG_TC) == 0) {}
    USART1->DR = (u8)ch;
    return ch;
}
#endif
